/*
Widget.hpp
----------

Par Bréhaut Vincent le 28/02/2011

Rôle: Classe de base de chaque composant de la GUI
*/

#ifndef DEF_WIDGET
#define DEF_WIDGET

#include <iostream>
#include <SFML/Graphics.hpp>
#include "../Engine.hpp"

struct Position
{
    int x;
    int y;
};
struct Dimensions
{
    float width;
    float height;
};

namespace GUI
{
    class Widget
    {
        public:
            Widget(Engine &Moteur);

            void SetPosition(const int x, const int y);
            void SetPositionX(const int x);
            void SetPositionY(const int y);
            void SetConteneurPosition(const int x, const int y);
            void SetConteneurPositionX(const int x);
            void SetConteneurPositionY(const int y);
            void SetDimensions(const unsigned int width, const unsigned int height);

            virtual bool IsHover();
            virtual bool IsClicked();
            virtual bool IsMove();
            virtual void SetParent(Widget *parent);
            virtual void OpenWidget(Widget *widget); // On a ouvert un widget (fenêtre)
            virtual void CloseWidget(Widget *widget); // On a fermer un widget (fenêtre)
            virtual void Open();
            virtual void Close();

            void Center(); // Centre l'objet en x dans l'objet parent, si il en possède un

            bool IsOpen();
            Dimensions GetDimensions() const;
            Position GetPosition() const;
            Position GetConteneurPosition() const;
            int GetPadding() const;

            virtual void Afficher();
            virtual void UpdateEvent();
        protected:
            Engine &m_Moteur;
            bool m_deplacement; // L'objet est en déplacement
            bool m_open; // Le Widget est ouvert?
            Position m_position; // Position réelle de l'objet
            Position m_conteneur_position; // Position dans le conteneur(si l'objet est contenu)
            Dimensions m_dimensions;
            int m_padding; // Padding à l'interieur du Widget
            Widget *m_parent; // Parent de l'objet
    };
}

#endif
